/*================================================================
*   Copyright (C) 2020 belonging to YangZhengQing. All rights reserved.
*   
*   文件名称：CRC_u8.c
*   创 建 者：YangZhengQing
*   创建日期：2020年03月02日
*   描    述：
*
*================================================================*/


#include <stdio.h>

#include "client.h"


const CRC_8 crc_8 = {0x07,0x00,0x00,FALSE,FALSE};
const CRC_8 crc_8_ITU = {0x07,0x00,0x55,FALSE,FALSE};
const CRC_8 crc_8_ROHC = {0x07,0xff,0x00,TRUE,TRUE};
const CRC_8 crc_8_MAXIM = {0x31,0x00,0x00,TRUE,TRUE};

/*
  *function name:reverse8
  *function: 字节反转，如1100 0101 反转后为1010 0011
  *input：1字节
  *output:反转后字节
*/

u8 reverse8(u8 data)
{
	u8 i;
	u8 temp=0;
	for(i=0;i<8;i++)	//字节反转
	{

	  temp |= ((data>>i) & 0x01)<<(7-i);
	}
	return temp;
}

/*
 功能：CRC校验，校验值为8位
 addr-数据首地址；num-数据长度（字节）；type-CRC8的算法类型
 */
u8 crc8(u8 *addr, int num, CRC_8 type)  
{  
	u8 data;
	u8 crc = type.InitValue;                   //初始值
	int i;  
	for (; num > 0; num--)               
	{  
		data = *addr++;
		if(type.InputReverse == TRUE)
		{

		  data = reverse8(data);                 //字节反转
		}
		crc = crc ^ data ;                     //与crc初始值异或 
		for (i = 0; i < 8; i++)                //循环8位 
		{  
			if (crc & 0x80)				//左移移出的位为1，左移后与多项式异或
			{

			  crc = (crc << 1) ^ type.poly;    
			}
			else				//否则直接左移
			{
				crc <<= 1;                  
			}
		}
	}
	if(type.OutputReverse == TRUE)//满足条件，反转
	{

	  crc = reverse8(crc);
	}
	crc = crc^type.xor;							//最后返与结果异或值异或

	return(crc);                               //返回最终校验值
}

/*
int main()
{
	unsigned char i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};

	 u8 crc;

	CRC_8 type;

	type.poly			= 0x21;
	type.InitValue		= 0x00;
	type.xor			= 0x01;
	type.InputReverse	= TRUE;
	type.OutputReverse  = TRUE;


	crc = crc8(i,8,type);

	printf("crc = 0x%x\n",crc);

	return 0;
} 

*/
